#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int g_unval;
int g_val = 100;
 
int main(int argc, char *argv[], char *env[])
{
        const char *str = "helloworld";
        printf("code addr: %p\n", main);
        printf("init global addr: %p\n", &g_val);
        printf("uninit global addr: %p\n", &g_unval);
 
        static int test = 10;
        char *heap_mem = (char*)malloc(10);
        char *heap_mem1 = (char*)malloc(10);
        char *heap_mem2 = (char*)malloc(10);
        char *heap_mem3 = (char*)malloc(10);
 
        printf("heap addr: %p\n", heap_mem);
        printf("heap addr: %p\n", heap_mem1);
        printf("heap addr: %p\n", heap_mem2);
        printf("heap addr: %p\n", heap_mem3);
 
        printf("test static addr: %p\n", &test);
        printf("stack addr: %p\n", &heap_mem);
        printf("stack addr: %p\n", &heap_mem1);
        printf("stack addr: %p\n", &heap_mem2);
        printf("stack addr: %p\n", &heap_mem3);
 
        printf("read only string add: %p\n", str);
        for (int i = 0; i < argc; i++)
        {
                printf("argv[%d]: %p\n", i, argv[i]);
        }
        for (int i = 0; env[i]; i++)
        {
                printf("env[%d]: %p\n", i, env[i]);
        }
        return 0;
}